﻿using CAD.BLL;
using CAD.DTO;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WFASmartketing.PRESENTACION_COMPRAS
{
    public partial class RegistroCompras : Form
    {
        private FrmPrincipal principal;
        AddProducto addproducto = null;
        public RegistroCompras(FrmPrincipal principal)
        {
            InitializeComponent();
            this.principal = principal;
            cbxproveedor.DropDownStyle = ComboBoxStyle.DropDownList;
            cbxvendedor.DropDownStyle = ComboBoxStyle.DropDownList;
            cbxcaja.DropDownStyle = ComboBoxStyle.DropDownList;
            cbxalmacen.DropDownStyle = ComboBoxStyle.DropDownList;
        }

        private void label3_Click(object sender, EventArgs e)
        {

        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            addproducto = new AddProducto(this);
            addproducto.MdiParent = principal;
            addproducto.Show();
        }
        public void cargarProductoalGrid(producto pro, int cantidad)
        {

            marca marca = marcaBLL.SelectByID(pro.Idmarca);
            categoria cat = categoriaBLL.SelectCategoriaByID(pro.Idcategoria);
            Object[] obj = { pro.Id, pro.Codigoproducto, pro.Descripcion, marca.Nombre, cat.Nombre, cantidad, pro.Costocompra, (cantidad * pro.Costocompra) };
            dataGridView1.Rows.Add(obj);
            txtcostototal.Text = calculartotales() + "";
            txtcantidad.Text = calcularCantidad() + "";
        }
        private int calcularCantidad()
        {
            int cantitdad = 0;
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                cantitdad = Convert.ToInt32(dataGridView1.Rows[i].Cells[5].Value.ToString()) + cantitdad;
            }
            return cantitdad;
        }
        private double calculartotales()
        {
            double cantitdad = 0;
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                cantitdad = Convert.ToDouble(dataGridView1.Rows[i].Cells[7].Value.ToString()) + cantitdad;
            }
            return cantitdad;
        }
        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
        {
            UTIIIDADES.UTILIDADES.Mayuscula(e);
        }

        private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
        {
            UTIIIDADES.UTILIDADES.Mayuscula(e);
        }

        private void textBox4_KeyPress(object sender, KeyPressEventArgs e)
        {
            UTIIIDADES.UTILIDADES.soloDecimanes(e, txtcantidad);
        }

        private void textBox5_KeyPress(object sender, KeyPressEventArgs e)
        {
            UTIIIDADES.UTILIDADES.soloDecimanes(e, txtcostototal);
        }

        private void RegistroCompras_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'vendedorDS.vendedor_selectAll' table. You can move, or remove it, as needed.
            this.vendedor_selectAllTableAdapter.Fill(this.vendedorDS.vendedor_selectAll);
            // TODO: This line of code loads data into the 'proveedorDS.proveedor_selectAll' table. You can move, or remove it, as needed.
            this.proveedor_selectAllTableAdapter.Fill(this.proveedorDS.proveedor_selectAll);
            // TODO: This line of code loads data into the 'almacenDS.almacen_selectAll' table. You can move, or remove it, as needed.
            this.almacen_selectAllTableAdapter.Fill(this.almacenDS.almacen_selectAll);
            // TODO: This line of code loads data into the 'cajaDS.caja_selectAll' table. You can move, or remove it, as needed.
            this.caja_selectAllTableAdapter.Fill(this.cajaDS.caja_selectAll);

        }

        private void rbcredito_CheckedChanged(object sender, EventArgs e)
        {
            cbxcaja.Enabled = false;
        }

        private void rbcontrato_CheckedChanged(object sender, EventArgs e)
        {
            cbxcaja.Enabled = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (dataGridView1.Rows.Count > 0)
            {
                if (dataGridView1.CurrentRow != null)
                {
                    int pos = dataGridView1.SelectedRows[0].Index;
                    dataGridView1.Rows.RemoveAt(pos);
                    txtcostototal.Text = calculartotales() + "";
                    txtcantidad.Text = calcularCantidad() + "";
                    return;
                }
                dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1);
                txtcostototal.Text = calculartotales() + "";
                txtcantidad.Text = calcularCantidad() + "";
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            this.Hide();
            if (addproducto != null)
            {
                addproducto.Close();
            }
        }
        private List<detalleCompra> CalcularDetalleCompra()
        {
            List<detalleCompra> detalle = new List<detalleCompra>();
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                detalleCompra det = new detalleCompra();
                det.Idproducto = Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value.ToString());
                det.Costo = Convert.ToDouble(dataGridView1.Rows[i].Cells[6].Value.ToString());
                det.Cantidad = Convert.ToInt32(dataGridView1.Rows[i].Cells[5].Value.ToString());
                detalle.Add(det);
            }
            return detalle;
        }
        private void limpiarPantalla()
        {
            txtcantidad.Text = "";
            txtgloza.Text = "";
            txtnumerofactura.Text = "";
            dataGridView1.Rows.Clear();
            txtcostototal.Text = calculartotales() + "";
            txtcantidad.Text = calcularCantidad() + "";
        }
        private void imprimirComprobante(int pkCompra)
        {
            MessageBoxButtons buttons = MessageBoxButtons.YesNo;
            DialogResult result;
            result = MessageBox.Show(this, "Desea Imprimir ver el comprobante", "REGISTRO DE DATOS", buttons);
            if (result == DialogResult.Yes)
            {
                REPORTES.ComprobanteCompra compra = new REPORTES.ComprobanteCompra(pkCompra);
                compra.MdiParent = principal;
                compra.Show();
                return;
            }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            if (dataGridView1.Rows.Count > 0)
            {
                int idalmacen = 0;
                int idproveedor = 0;
                int idvendedor =0;
                int idacaja =0;
                try
                {
                     idalmacen = (int)cbxalmacen.SelectedValue;
                     idproveedor = (int)cbxproveedor.SelectedValue;
                     idvendedor = (int)cbxvendedor.SelectedValue;
                     idacaja = (int)cbxcaja.SelectedValue;
                }
                catch (Exception)
                {
                      MessageBox.Show(this, "No Existen Algunos Datos", "ADVERTENCIA");
                          return;
                }
                DateTime fecha = dtcfecha.Value;
                string nrofactura = txtnumerofactura.Text;
                string gloza = txtgloza.Text;
                string tipocompra;
                string estadocompra;
                int idlogueado = principal.ObtenerLogueado().Id;
                double total = Convert.ToDouble(txtcostototal.Text);
                List<detalleCompra> detalle = CalcularDetalleCompra();

                //compra al credito
                if (rbcredito.Checked)
                {
                    tipocompra = "CREDITO";
                    estadocompra = "PENDIENTE";
                    int pkCompra = compraBLL.insertar(idproveedor, idvendedor, idlogueado, idalmacen, tipocompra, fecha, DateTime.Now, estadocompra, nrofactura, total, gloza, idacaja);
                    try
                    {
                        for (int i = 0; i < detalle.Count; i++)
                        {
                            detalleCompra det = detalle.ElementAt(i);
                            detalleCompraBLL.insertar(pkCompra, det.Idproducto, det.Cantidad, det.Costo);

                        } 
                        MessageBox.Show(this, "Se registro la compra exitosamente"+" Nro de compra: "+pkCompra, "REGISTRO DE COMPRA");
                        imprimirComprobante(pkCompra);
                        limpiarPantalla();
                        return;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(this, "No se registro la compra", "ERROR");
                        return;
                    }
                }

                //compra al contado

                tipocompra = "CONTADO";
                estadocompra = "PAGADO";
                caja caja = cajaBLL.SelectByID(idacaja);
                double montoActual = caja.Monto - total;
                try
                {
                    int pkCompra1 = compraBLL.insertar(idproveedor, idvendedor, idlogueado, idalmacen, tipocompra, fecha, DateTime.Now, estadocompra, nrofactura, total, gloza, idacaja);
                    for (int i = 0; i < detalle.Count; i++)
                    {
                        detalleCompra det = detalle.ElementAt(i);
                        detalleCompraBLL.insertar(pkCompra1, det.Idproducto, det.Cantidad, det.Costo);
                        cajaBLL.updatemonto(idacaja, montoActual);

                    }
                    MessageBox.Show(this, "Se registro la compra exitosamente" + " Nro de compra: " + pkCompra1, "REGISTRO DE COMPRA");
                    imprimirComprobante(pkCompra1); limpiarPantalla();
                    return;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, "No se registro la compra", "ERROR");
                    return;
                }
            }
            MessageBox.Show(this, "Inserte algun producto", "REGISTRO DE COMPRA");
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            limpiarPantalla();
        }

        private void RegistroCompras_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (addproducto != null)
            {
                addproducto.Close();
            }
        }
    }
}
